﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныеПроцедурыИФункции

Функция ЕстьЗапись(ПериодЗаписи, ТипЗаписи, Ключ, ОперацияСтатистики)
    
    Запрос = Новый Запрос;
    
    Запрос.Текст = "
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |   ИСТИНА
    |ИЗ
    |   РегистрСведений.ЗамерыСтатистики
    |ГДЕ
    |   ПериодЗаписи = &ПериодЗаписи
    |   И ТипЗаписи = &ТипЗаписи
    |   И Ключ = &Ключ
    |   И ОперацияСтатистики = &ОперацияСтатистики
    |";
    
    Запрос.УстановитьПараметр("ПериодЗаписи", ПериодЗаписи);
    Запрос.УстановитьПараметр("ТипЗаписи", ТипЗаписи);
    Запрос.УстановитьПараметр("Ключ", Ключ);
    Запрос.УстановитьПараметр("ОперацияСтатистики", ОперацияСтатистики);
    
    
    УстановитьПривилегированныйРежим(Истина);
    Результат = Запрос.Выполнить();
    УстановитьПривилегированныйРежим(Ложь);
    
    Возврат НЕ Результат.Пустой();    
    
КонецФункции

Процедура ЗаписатьОперациюБизнесСтатистики(ПериодЗаписи, ТипЗаписи, Ключ, ОперацияСтатистики, ЗначениеОперации, Замещать) Экспорт
    
    ЕстьЗапись = ЕстьЗапись(ПериодЗаписи, ТипЗаписи, Ключ, ОперацияСтатистики);
    
    Если НЕ ЕстьЗапись ИЛИ Замещать Тогда
        
        НачатьТранзакцию();
        Попытка
            
            Блокировка = Новый БлокировкаДанных;
            
            ЭлементБлокировкиПериодЗаписи = Блокировка.Добавить("РегистрСведений.ЗамерыСтатистики");
		    ЭлементБлокировкиПериодЗаписи.УстановитьЗначение("ПериодЗаписи", ПериодЗаписи);            
            ЭлементБлокировкиПериодЗаписи.УстановитьЗначение("ТипЗаписи", ТипЗаписи);                  
            ЭлементБлокировкиПериодЗаписи.УстановитьЗначение("Ключ", Ключ);                            
            ЭлементБлокировкиПериодЗаписи.УстановитьЗначение("ОперацияСтатистики", ОперацияСтатистики);
                           
		    Блокировка.Заблокировать();
            
            ЕстьЗапись = ЕстьЗапись(ПериодЗаписи, ТипЗаписи, Ключ, ОперацияСтатистики);
            
            Если НЕ ЕстьЗапись ИЛИ Замещать Тогда
                
                МенеджерЗаписи = СоздатьМенеджерЗаписи();
                МенеджерЗаписи.ПериодЗаписи = ПериодЗаписи;
                МенеджерЗаписи.Ключ = Ключ;
                МенеджерЗаписи.ТипЗаписи = ТипЗаписи;
                МенеджерЗаписи.ОперацияСтатистики = ОперацияСтатистики;
                МенеджерЗаписи.ИдентификаторУдаления = НачалоДня(ПериодЗаписи);
                МенеджерЗаписи.ЗначениеОперации = ЗначениеОперации;
                
                УстановитьПривилегированныйРежим(Истина);
                Если ЕстьЗапись И Замещать Тогда
                    МенеджерЗаписи.Записать(Истина);
                Иначе
                    МенеджерЗаписи.Записать(Ложь);
                КонецЕсли;
                УстановитьПривилегированныйРежим(Ложь);
                
            КонецЕсли;
            ЗафиксироватьТранзакцию();
        Исключение
            ОтменитьТранзакцию();
        КонецПопытки;
        
    КонецЕсли;
         
КонецПроцедуры

Функция ПолучитьЗамерыЧаса(ДатаНачала, ДатаОкончания) Экспорт
    
    Возврат ПолучитьЗамерыПоТипу(ДатаНачала, ДатаОкончания, 1);
        
КонецФункции

Функция ПолучитьЗамерыСутки(ДатаНачала, ДатаОкончания) Экспорт
    
    Возврат ПолучитьЗамерыПоТипу(ДатаНачала, ДатаОкончания, 2);
        
КонецФункции

Функция ПолучитьЗамерыПоТипу(ДатаНачала, ДатаОкончания, ТипЗаписи)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |   ОперацииСтатистики.Наименование КАК ОперацияСтатистики,
    |   ЗамерыОперацииСтатистики.ПериодЗаписи КАК Период,
    |   КОЛИЧЕСТВО(*) КАК КоличествоЗначений,
    |   СУММА(ЗамерыОперацииСтатистики.ЗначениеОперации) КАК СуммаЗначений
    |ИЗ
    |   РегистрСведений.ЗамерыСтатистики КАК ЗамерыОперацииСтатистики
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |   РегистрСведений.ОперацииСтатистики КАК ОперацииСтатистики
	|ПО
	|	ЗамерыОперацииСтатистики.ОперацияСтатистики = ОперацииСтатистики.ИдентификаторОперации
    |ГДЕ
    |   ЗамерыОперацииСтатистики.ТипЗаписи = &ТипЗаписи
    |   И ЗамерыОперацииСтатистики.ПериодЗаписи МЕЖДУ &ДатаНачала И &ДатаОкончания
    |СГРУППИРОВАТЬ ПО
    |   ОперацииСтатистики.Наименование,
    |   ЗамерыОперацииСтатистики.ПериодЗаписи
    |";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    Запрос.УстановитьПараметр("ТипЗаписи", ТипЗаписи);
    
    Результат = Запрос.Выполнить();
    
    Возврат Результат;
    
КонецФункции

Процедура УдалитьЗаписи(ГраницаАгрегирования, ОбработатьЗаписиДо) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
	               |	ЗамерыСтатистики.ПериодЗаписи КАК ПериодЗаписи
	               |ИЗ
	               |	РегистрСведений.ЗамерыСтатистики КАК ЗамерыСтатистики
	               |ГДЕ
	               |	ЗамерыСтатистики.ПериодЗаписи >= &ГраницаАгрегирования
	               |	И ЗамерыСтатистики.ПериодЗаписи < &ОбработатьЗаписиДо
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	ЗамерыСтатистики.ПериодЗаписи";
	
	Запрос.УстановитьПараметр("ГраницаАгрегирования", ГраницаАгрегирования);
	Запрос.УстановитьПараметр("ОбработатьЗаписиДо", ОбработатьЗаписиДо);
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	НаборЗаписей = СоздатьНаборЗаписей();
	Пока Выборка.Следующий() Цикл
		НаборЗаписей.Отбор.ПериодЗаписи.Установить(Выборка.ПериодЗаписи);
		НаборЗаписей.Записать(Истина);
	КонецЦикла;
КонецПроцедуры

#КонецОбласти

#КонецЕсли
